/**
 * @file sensor_collector.h
 * @brief 传感器数据采集模块头文件
 * 
 * 该模块实现定时采集各线程传感器数据，并提供快速访问接口。
 * 支持多种传感器类型，使用读写锁保证线程安全。
 * 
 * @author 伞控无人机项目组
 * @date 2024
 */

#ifndef SENSOR_COLLECTOR_H
#define SENSOR_COLLECTOR_H

#include <time.h>
#include <pthread.h>

// 传感器数据类型枚举
typedef enum {
    SENSOR_PROX1 = 0,    // 接近传感器1 (线程4)
    SENSOR_PROX2,        // 接近传感器2 (线程5)
    SENSOR_NAV,          // 组合导航系统 (线程8)
    SENSOR_RS485,        // RS485传感器 (线程9)
    SENSOR_COUNT         // 传感器总数
} sensor_type_t;

// 接近传感器数据结构
typedef struct {
    float distance;       // 距离值 (mm)
    int status;           // 状态 (0=正常, 1=异常)
    time_t timestamp;     // 时间戳
} prox_sensor_data_t;

// 导航传感器数据结构
typedef struct {
    double latitude;      // 纬度 (度)
    double longitude;     // 经度 (度)
    float altitude;       // 高度 (m)
    float heading;        // 航向 (度)
    float pitch;          // 俯仰角 (度)
    float roll;           // 横滚角 (度)
    time_t timestamp;     // 时间戳
} nav_sensor_data_t;

// RS485传感器数据结构
typedef struct {
    float value1;         // 数值1
    float value2;         // 数值2
    int status;           // 状态 (0=正常, 1=异常)
    time_t timestamp;     // 时间戳
} rs485_sensor_data_t;

// 传感器数据联合体
typedef union {
    prox_sensor_data_t prox_data;      // 接近传感器数据
    nav_sensor_data_t nav_data;        // 导航数据
    rs485_sensor_data_t rs485_data;    // RS485数据
} sensor_data_t;

// 传感器状态结构
typedef struct {
    sensor_type_t type;       // 传感器类型
    sensor_data_t data;       // 传感器数据
    int is_valid;             // 数据是否有效
    time_t last_update;       // 最后更新时间
    int error_count;          // 错误计数
} sensor_status_t;

// 传感器数据快照（用于RS232发送）
typedef struct {
    time_t timestamp;         // 快照时间戳
    int data_count;           // 有效数据数量
    
    // 接近传感器数据
    float prox1_distance;     // 接近传感器1距离
    int prox1_status;         // 接近传感器1状态
    float prox2_distance;     // 接近传感器2距离
    int prox2_status;         // 接近传感器2状态
    
    // 导航数据
    double nav_latitude;      // 导航纬度
    double nav_longitude;     // 导航经度
    float nav_altitude;       // 导航高度
    float nav_heading;        // 导航航向
    
    // RS485数据
    float rs485_value1;       // RS485数值1
    float rs485_value2;       // RS485数值2
    int rs485_status;         // RS485状态
} sensor_data_snapshot_t;

// 全局传感器数据表
typedef struct {
    sensor_status_t sensors[SENSOR_COUNT];  // 传感器状态数组
    pthread_rwlock_t sensor_locks[SENSOR_COUNT];  // 每个传感器独立锁
    time_t last_full_update;               // 最后全量更新时间
    int update_count;                      // 更新计数器
    int total_error_count;                 // 总错误计数
} global_sensor_data_t;

// 线程10函数声明
void *sensor_data_collector_function(void *arg);

// 停止传感器数据采集线程
void sensor_collector_stop(void);

// 数据访问接口（线程6使用）
int get_all_sensor_data(global_sensor_data_t *data_copy);
int get_sensor_data(sensor_type_t type, sensor_status_t *data);
int get_sensor_collector_snapshot(sensor_data_snapshot_t *snapshot);

// 初始化传感器数据表
int init_sensor_data_table(void);

// 清理传感器数据表
void cleanup_sensor_data_table(void);

// 获取传感器类型名称
const char* get_sensor_type_name(sensor_type_t type);

// 获取传感器数据有效性
int is_sensor_collector_data_valid(sensor_type_t type);

// 获取最后更新时间
time_t get_sensor_last_update(sensor_type_t type);

#endif /* SENSOR_COLLECTOR_H */ 